﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using CapaDeDominio;

namespace CapaDeDatos.EF
{
    public class ClienteDAO : IClienteDAO
    {
       #region IBaseDAO<Cliente,int> Members

        /// <summary>
        /// Crear Cliente para realizar la reserva
        /// </summary>
        /// <param name="ClienteACrear">Dominio Cliente</param>
        /// <returns>Dominio Cliente</returns>
        public Cliente Crear(Cliente ClienteACrear)
        {
            using (EFContext db = new EFContext(ConexionUtil.ObtenerCadena()))
            {
                int? codigo = db.Clientes.Select(l => (int?)l.Codigo).Max();
                ClienteACrear.Codigo = (codigo ?? 0) + 1;
                db.Maestras.Attach(ClienteACrear.Tip_Documento);
                int codigoUsuario = db.Usuarios.Select(l => (int?)l.Codigo).Max().GetValueOrDefault(0);
                ClienteACrear.Usuario.Codigo = codigoUsuario + 1;
                db.Clientes.Add(ClienteACrear);
                db.SaveChanges();
            }
            return Obtener(ClienteACrear.Codigo);
        }

        public void Eliminar(Cliente itemEliminar)
        {
            using (EFContext db = new EFContext(ConexionUtil.ObtenerCadena()))
            {
                Cliente cliente = (from s in db.Clientes
                                 .Include("Usuario")
                                 .Include("Tip_Documento")                               
                                   where s.Codigo == itemEliminar.Codigo
                                   select s).Single(); 
                db.Clientes.Remove(cliente);
                db.SaveChanges();
            }
        }

        /// <summary>
        /// Obtener Cliente
        /// </summary>
        /// <param name="Codigo">Codigo del Cliente</param>
        /// <returns></returns>
        public Cliente Obtener(int Codigo)
        {
            using (EFContext db = new EFContext(ConexionUtil.ObtenerCadena()))
            {
                var cliente = from l in db.Clientes
                            .Include("Usuario")
                            .Include("Tip_Documento")    
                            where l.Codigo == Codigo
                            select l;
                return cliente.SingleOrDefault();
            }
        }

        /// <summary>
        /// Verifica si hay correo repetido en la tabla
        /// </summary>
        /// <param name="correo"></param>
        /// <returns></returns>
        public int VerificarCorreo(String correo)
        {
            using (EFContext db = new EFContext(ConexionUtil.ObtenerCadena()))
            {
                var resultado = from l in db.Clientes
                                where l.Correo == correo
                                select l.Codigo;
                return resultado.Count();
            }
        }

        public ICollection<Cliente> ListarTodos()
        {
            using (EFContext db = new EFContext(ConexionUtil.ObtenerCadena()))
            {
                var resultado = from l in db.Clientes
                                .Include("Usuario")
                                .Include("Tip_Documento") 
                                select l;
                return resultado.ToList();
            }
        }
                
        #endregion


        public ICollection<Cliente> ListarxFiltros(Maestra tipoDocumento, string documento, string correo)
        {
            using (EFContext db = new EFContext(ConexionUtil.ObtenerCadena()))
            {
                var busqueda = from s in db.Clientes
                               .Include("Usuario")
                                .Include("Tip_Documento") 
                               select s;
                if (tipoDocumento != null && documento != null) 
                    busqueda = busqueda.Where(s => s.Tip_Documento.Codigo == tipoDocumento.Codigo && s.Nro_Documento.Contains(documento));
                if (correo != null) 
                    busqueda = busqueda.Where(s => s.Correo.Contains(correo));
                return busqueda.ToList();
            }
        }
    }
}